-
-
Notifications
You must be signed in to change notification settings - Fork 46.6k
add exponential search algorithm #10732
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
for more information, see https://pre-commit.ci
… tests delete exponential_search.py file
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice addition!
For optional extra credit, add a timeit
benchmark to show relative performance.
searches/binary_search.py
Outdated
@@ -297,6 +297,49 @@ def binary_search_by_recursion( | |||
return binary_search_by_recursion(sorted_collection, item, midpoint + 1, right) | |||
|
|||
|
|||
def exponential_search(sorted_collection: list[int], item: int) -> int | None: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am not a fan of functions that return multiple datatypes. If the search fails, let's return -1
(like "Hello".find("Z")
) or raise a ValueError
(like "Hello".index("Z")
).
def exponential_search(sorted_collection: list[int], item: int) -> int | None: | |
def exponential_search(sorted_collection: list[int], item: int) -> int: |
Co-authored-by: Christian Clauss <[email protected]>
Co-authored-by: Christian Clauss <[email protected]>
Co-authored-by: Christian Clauss <[email protected]>
Co-authored-by: Christian Clauss <[email protected]>
for more information, see https://pre-commit.ci
Co-authored-by: Christian Clauss <[email protected]>
Co-authored-by: Christian Clauss <[email protected]>
I thought more about sorting the sorted collection… it is a bad idea. The second item in might be different in the two lists so the function might tell me that is the second item when in my list it is the third item. So, the implementations should raise ValueError on unsorted input. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is a really slick addition. Thanks for doing it!
@cclauss thank you for your suggestions :) |
@cclauss Since exponential search is a different algorithm from binary search, why was it placed in the |
bound *= 2 | ||
left = bound // 2 | ||
right = min(bound, len(sorted_collection) - 1) | ||
last_result = binary_search_by_recursion( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@tianyizheng02 exponential_search()
embeds a call to binary_search_by_recursion()
but as the benchmarks demonstrate delivers a faster result. Looking at the first commit makes this clearer.
* add exponential_search algorithm * replace binary_search with binary_search_recursion * convert left type to int to be useable in binary_search_recursion * add docs and tests for exponential_search algorithm * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * move exponential_search to binary_search.py to pass github auto build tests delete exponential_search.py file * Update searches/binary_search.py Co-authored-by: Christian Clauss <[email protected]> * remove additional space searches/binary_search.py Co-authored-by: Christian Clauss <[email protected]> * return single data type in exponential_search searches/binary_search.py Co-authored-by: Christian Clauss <[email protected]> * add doctest mod searches/binary_search.py Co-authored-by: Christian Clauss <[email protected]> * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * use // instread of int() convert searches/binary_search.py Co-authored-by: Christian Clauss <[email protected]> * change test according to new code searches/binary_search.py Co-authored-by: Christian Clauss <[email protected]> * fix binary_search_recursion multiple type return error * add a timeit benchmark for exponential_search * sort input of binary search to be equal in performance test with exponential_search * raise value error instead of sorting input in binary and exonential search to fix bugs * Update binary_search.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <[email protected]> Co-authored-by: user <[email protected]>
Describe your change:
added exponential algorithm using binary_search_recursion also tests and docs about it
Checklist: